package com.security.manage.apigateway.service;

import com.security.manage.apigateway.model.LocalCacheItem;
import org.springframework.stereotype.Component;

import java.util.Map;
import java.util.Set;
import java.util.concurrent.ConcurrentHashMap;
import java.util.concurrent.TimeUnit;

@Component
public class LocalCacheService {

    private Map<String, LocalCacheItem> cache = new ConcurrentHashMap<>();

    public boolean containsKey(String key){
        return cache.containsKey(key);
    }

    /**
     * 缓存值
     * @author:
     * @date: 2018年2月6日 下午5:24:20
     * @param key
     * @param value
     */
    public void put(String key, Set<String> value){
        LocalCacheItem item = new LocalCacheItem(0, System.currentTimeMillis(), value);
        cache.put(key, item);
    }

    /**
     * 缓存值-指定缓存时间
     * @author:
     * @date: 2018年2月6日 下午5:35:05
     * @param key
     * @param value
     * @param cacheTime 缓存时间
     * @param unit 缓存时间单位
     */
    public void put(String key, Set<String> value, long cacheTime, TimeUnit unit){
        LocalCacheItem item = new LocalCacheItem(unit.toMillis(cacheTime), System.currentTimeMillis(), value);
        cache.put(key, item);
    }

    /**
     * 获取值
     * @author:
     * @date: 2018年2月6日 下午5:34:28
     * @param key
     * @return
     */
    public Set<String> get(String key){
        LocalCacheItem item = cache.get(key);
        if(item==null){
            return null;
        }
        return item.getValue();
    }

    public void refresh() {
        for(String key : cache.keySet()){
            LocalCacheItem item = cache.get(key);
            // 过期了移除缓存
            long currentTime = System.currentTimeMillis();
            if(item.getCacheTime()>0 && currentTime - item.getCreateTime() > item.getCacheTime()) {
                cache.remove(key);
            }
        }
    }

}
